#!/bin/bash

# 日志轮转日志文件
LOG_ROTATE_LOG="$ERROR_LOG_DIR/../log-rotate.log"

# 记录日志函数
log_message() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_ROTATE_LOG"
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 错误处理函数
handle_error() {
  log_message "错误: $1"
  exit 1
}

# 初始化日志文件
init_log_file() {
  # 确保日志目录存在
  mkdir -p "$(dirname "$LOG_ROTATE_LOG")"
  # 创建日志文件（如果不存在）
  touch "$LOG_ROTATE_LOG"
}

# 初始化日志文件
init_log_file
log_message "开始执行日志轮转..."

# 日志目录 - 根据环境选择
if [ "$NODE_ENV" = "production" ] || [ -d "/var/log/node-express-mysql" ]; then
  # 生产环境使用绝对路径
  ERROR_LOG_DIR="/var/log/node-express-mysql/error"
  OUTPUT_LOG_DIR="/var/log/node-express-mysql/output"
  log_message "使用生产环境日志路径: $ERROR_LOG_DIR, $OUTPUT_LOG_DIR"
else
  # 开发环境使用相对路径
  LOG_DIR="./logs"
  ERROR_LOG_DIR="$LOG_DIR/error"
  OUTPUT_LOG_DIR="$LOG_DIR/output"
  log_message "使用开发环境日志路径: $ERROR_LOG_DIR, $OUTPUT_LOG_DIR"
fi

# 获取当前日期
DATE=$(date +"%Y-%m-%d")

# 轮转PM2错误日志
if [ -f "$ERROR_LOG_DIR/pm2-system-error.log" ]; then
  log_message "开始轮转错误日志"
  mv "$ERROR_LOG_DIR/pm2-system-error.log" "$ERROR_LOG_DIR/pm2-system-error-$DATE.log"
  
  # 压缩轮转后的日志文件
  log_message "压缩错误日志文件"
  gzip "$ERROR_LOG_DIR/pm2-system-error-$DATE.log" || handle_error "无法压缩错误日志文件"
  log_message "已轮转并压缩错误日志到 pm2-system-error-$DATE.log.gz"
fi

# 轮转PM2输出日志
if [ -f "$OUTPUT_LOG_DIR/pm2-system-output.log" ]; then
  log_message "开始轮转输出日志"
  mv "$OUTPUT_LOG_DIR/pm2-system-output.log" "$OUTPUT_LOG_DIR/pm2-system-output-$DATE.log"
  
  # 压缩轮转后的日志文件
  log_message "压缩输出日志文件"
  gzip "$OUTPUT_LOG_DIR/pm2-system-output-$DATE.log" || handle_error "无法压缩输出日志文件"
  log_message "已轮转并压缩输出日志到 pm2-system-output-$DATE.log.gz"
fi

# 重启PM2应用以创建新的日志文件
log_message "重启PM2应用以创建新的日志文件"
pm2 restart all || handle_error "PM2重启失败"

# 清理过期日志文件（30天前）
log_message "清理30天前的过期日志文件"
find "$ERROR_LOG_DIR" -name "pm2-system-error-*.log*" -mtime +30 -delete
find "$OUTPUT_LOG_DIR" -name "pm2-system-output-*.log*" -mtime +30 -delete
log_message "过期日志文件清理完成"

# 清理轮转日志本身（如果超过10MB）
if [ -f "$LOG_ROTATE_LOG" ]; then
  LOG_SIZE=$(du -m "$LOG_ROTATE_LOG" | cut -f1)
  if [ "$LOG_SIZE" -gt 10 ]; then
    log_message "轮转日志文件过大，创建新的轮转日志"
    mv "$LOG_ROTATE_LOG" "$LOG_ROTATE_LOG.$(date +"%Y%m%d%H%M%S")"
    touch "$LOG_ROTATE_LOG"
  fi
fi

log_message "日志轮转完成！"